package gestorbienraizok.inmuebles;

import gestorBD.Controlador;

public class Apartamento extends Inmueble {

    private static int numeroDeApartamentosRegistrados = 0;
    int numeroDeParqueaderos;

    public Apartamento() {
        Apartamento.numeroDeApartamentosRegistrados++;
    }

    public Apartamento(String codigo, int numeroDeParqueaderos) {
        super(codigo);
        this.numeroDeParqueaderos = numeroDeParqueaderos;
        Apartamento.numeroDeApartamentosRegistrados++;

    }

    public static int getNumeroDeApartamentosRegistrados() {
        return Apartamento.numeroDeApartamentosRegistrados;
    }

    public int getNumeroDeParqueaderos() {
        return this.numeroDeParqueaderos;
    }

    public static void setNumeroDeApartamentosRegistrados(int numero) {
        Apartamento.numeroDeApartamentosRegistrados = numero;
    }

    public void setNumeroDeParqueaderos(int numeroDeParqueaderos) {
        this.numeroDeParqueaderos = numeroDeParqueaderos;
    }

    public Torre getTorre() {
        return Torre.buscarTorrePorCodigoDeApartamento(this.codigo);
    }

    public String toStringParaBusquedaPorCriterios(boolean esParaArrendar) {
        String descripcion = new String();

        Unidad estaUnidad = Unidad.buscarUnidadPorCodigoDeInmueble(this.codigo);
        descripcion += String.format("%-9s", this.codigo);
        descripcion += String.format("%-19s", estaUnidad.getDireccion());
        descripcion += String.format("%-28s", estaUnidad.getNombre());
        descripcion += String.format("%-10s", this.getTorre().getNumeroDeTorre());
        if (esParaArrendar) {
            descripcion += Controlador.formatearPrecio(this.getTarifaDeArrendamiento());
        } else {
            descripcion += Controlador.formatearPrecio(this.getPrecioDeVenta());
        }

        return descripcion;
    }

    public static boolean elApartamentoAplica(Apartamento esteApartamento, boolean seBuscaParaArrendar, int areaMinima,
            int areaMaxima, byte estratoMinimo, byte estratoMaximo, byte numeroDeBanhosMinimo,
            byte numeroDeEspaciosMinimo, byte numeroMinimoParqueaderos, long valorMinimo, long valorMaximo) {

        //Antes de comparar las caracteristicas, se verifica que el rol del apartamento no sea "No disponible"
        //y que tampoco haya sido ya vendido o arrendado.También que su rol coincida con el que se busca
        if (esteApartamento.obtenerRol().equals("No disponible") || !esteApartamento.obtenerDisponibilidad().equals("Disponible")) {
            return false;
        }

        boolean sePuedeArrendarElApto;
        if (esteApartamento.obtenerRol().toLowerCase().contains("alquiler")) {
            sePuedeArrendarElApto = true;
        } else { //si solo esta para la venta
            sePuedeArrendarElApto = false;
        }

        boolean sePuedeVenderElApto;
        if (esteApartamento.obtenerRol().toLowerCase().contains("venta")) {
            sePuedeVenderElApto = true;
        } else { //Si solo esta para arrendar
            sePuedeVenderElApto = false;
        }

        if (seBuscaParaArrendar && !sePuedeArrendarElApto) {
            return false;
        }

        if (!seBuscaParaArrendar && !sePuedeVenderElApto) {
            return false;
        }

        float areaApto = esteApartamento.getAreaTotal();
        byte estratoApto = esteApartamento.getUnidad().getEstrato();
        byte numBanhosApto = esteApartamento.numeroDeBanhos();
        byte numEspaciosApto = esteApartamento.numeroDePiezas();
        int nuemeroParqueaderosApto = esteApartamento.getNumeroDeParqueaderos();
        long valorVentaApto = esteApartamento.getPrecioDeVenta();
        long valorArrendApto = esteApartamento.getTarifaDeArrendamiento();

        //Ya estan guardadas todas las caracteristicas del apartamento en variables. Ahora se puede comparar:
        if (areaApto < areaMinima || areaApto > areaMaxima) {
            return false;
        }

        if (estratoApto < estratoMinimo || estratoApto > estratoMaximo) {
            return false;
        }

        if (numBanhosApto < numeroDeBanhosMinimo) {
            return false;
        }

        if (numEspaciosApto < numeroDeEspaciosMinimo) {
            return false;
        }

        if (nuemeroParqueaderosApto < numeroMinimoParqueaderos) {
            return false;
        }

        if (seBuscaParaArrendar) {
            if (valorArrendApto < valorMinimo || valorArrendApto > valorMaximo) {
                return false;
            }
        } else {
            if (valorVentaApto < valorMinimo || valorVentaApto > valorMaximo) {
                return false;
            }
        }

        return true;   //Si pasa todas las comprobaciones

    }

    @Override
    public String toString() {
        String descripcion = new String();
        descripcion += "Código:            " + this.codigo + "\n";
        descripcion += "Área total:        " + this.areaTotal + " m2\n";
        descripcion += "Parqueaderos:      " + this.numeroDeParqueaderos + "\n";
        descripcion += "Número de alcobas: " + this.numeroDePiezas() + "\n";
        descripcion += "Número de baños:   " + this.numeroDeBanhos() + "\n\n";

        Torre estaTorre = Torre.buscarTorrePorCodigoDeApartamento(this.codigo);
        descripcion += "Características de la torre:\n";
        descripcion += estaTorre.toString();

        descripcion += "Características de la unidad:\n";
        descripcion += this.getUnidad().toString() + "\n";

        if (this.obtenerDisponibilidad().equals("Disponible")) {

            if (this.obtenerRol().equals("Venta")) {
                descripcion += "Esta propiedad está disponible para la venta:\n";
                descripcion += "Precio de venta:    " + Controlador.formatearPrecio(this.precioDeVenta) + "\n";
            } else if (this.obtenerRol().equals("Alquiler")) {
                descripcion += "Esta propiedad está disponible para arrendar:\n";
                descripcion += "Tarifa de arrendamiento:    " + Controlador.formatearPrecio(this.tarifaDeArrendamiento) + " mensual (administración incluida)\n";
            } else if (this.obtenerRol().equals("Venta y alquiler")) {
                descripcion += "Esta propiedad está disponible para la venta o para arrendar:\n";
                descripcion += "Precio de venta:            " + Controlador.formatearPrecio(this.precioDeVenta) + "\n";
                descripcion += "Tarifa de arrendamiento:    " + Controlador.formatearPrecio(this.tarifaDeArrendamiento) + " mensual (administración incluida)\n";
            } else {
                descripcion += "A esta propiedad no se la ha asignado un rol\n";
            }

        } else {
            descripcion += "Esta propiedad no está disponible. Ya fue " + this.obtenerDisponibilidad().toLowerCase();
        }
        return descripcion;
    }

    @Override
    public String getTipo() {
        return "Apartamento";
    }
}
